package produto;

import bd.ConBdSqlS;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author camilo
 */
public class ProdutoDao {

  protected Connection con;

  public ProdutoDao() throws SQLException {
    this.con = ConBdSqlS.getConexao();
  }

  public List<Produto> getListaDesc(String desc) throws SQLException {
    String sql = "SELECT barras, produtos.produto, produtos.descricao, "
            + "produtos.custobruto, produtos.precovenda, "
            + "SUM(ProdutoMovimentoEstoque.Quantidade) as quantidade "
            + "FROM (produtos INNER JOIN produtobarras ON produtos.produto = produtobarras.produto ) "
            + "LEFT JOIN ProdutoMovimentoEstoque on Produtos.PRODUTO = ProdutoMovimentoEstoque.produto "
            + "WHERE produtos.descricao LIKE ? "
            + "AND (ProdutoMovimentoEstoque.Local = '0' OR ProdutoMovimentoEstoque.Local IS NULL) "
            + "GROUP BY Barras, produtos.produto, produtos.descricao,produtos.custobruto, produtos.precovenda "
            + "ORDER BY produtos.descricao";
    PreparedStatement stmt = this.con.prepareStatement(sql);
    stmt.setString(1, "%" + desc + "%");
    ResultSet rs = stmt.executeQuery();

    List<Produto> minhaLista = new ArrayList<>();

    //percorre os registros da tabela
    while (rs.next()) {
      Produto pr = new Produto();
      pr.setBarras(rs.getString("barras"));
      pr.setProduto(rs.getInt("produto"));
      pr.setDescricao(rs.getString("descricao"));
      pr.setCustoBruto(rs.getFloat("custobruto"));
      pr.setPrecoVenda(rs.getFloat("precovenda"));
      pr.setQuantidade(rs.getFloat("quantidade"));
      minhaLista.add(pr);
    }

    rs.close();
    stmt.close();
    return minhaLista;
  }

  /**
   * Retorna uma lista contendo os dados dos produtos.
   *
   * @param b - Código de barras a ser consultado
   * @return lista com os dados obtidos na consulta SQL
   * @throws SQLException
   */
  public List<Produto> getListaBarras(String b) throws SQLException {
    NumberFormat nf = new DecimalFormat("00000000000000");
    b = nf.format(Double.parseDouble(b));
    System.out.println(b);
    String sql = "SELECT barras, produtos.produto, produtos.descricao, "
            + "produtos.custobruto, produtos.precovenda, "
            + "SUM(ProdutoMovimentoEstoque.Quantidade) as quantidade "
            + "FROM (produtos INNER JOIN produtobarras ON produtos.produto = produtobarras.produto ) "
            + "LEFT JOIN ProdutoMovimentoEstoque on Produtos.PRODUTO = ProdutoMovimentoEstoque.produto "
            + "WHERE ProdutoBarras.Barras LIKE ? "
            + "AND (ProdutoMovimentoEstoque.Local = '0' OR ProdutoMovimentoEstoque.Local IS NULL) "
            + "GROUP BY Barras, produtos.produto, produtos.descricao,produtos.custobruto, produtos.precovenda "
            + "ORDER BY produtos.descricao";

    PreparedStatement stmt = this.con.prepareStatement(sql);
    stmt.setString(1, "%" + b);
    ResultSet rs = stmt.executeQuery();

    List<Produto> minhaLista = new ArrayList<>();

    //percorre os registros da tabela
    while (rs.next()) {
      Produto pr = new Produto();
      pr.setBarras(rs.getString("barras"));
      pr.setProduto(rs.getInt("produto"));
      pr.setDescricao(rs.getString("descricao"));
      pr.setCustoBruto(rs.getFloat("custobruto"));
      pr.setPrecoVenda(rs.getFloat("precovenda"));
      pr.setQuantidade(rs.getFloat("quantidade"));
      minhaLista.add(pr);
    }

    rs.close();
    stmt.close();
    return minhaLista;
  }

  public Produto getProduto(String bar) throws SQLException {
    Produto p = new Produto();//instancia um novo objeto
    //    Código SQL
    String sql = "SELECT top(1) barras, produtos.produto, produtos.descricao, suspendercompra, mva "
            + "FROM produtos INNER JOIN produtobarras "
            + "ON produtos.produto = produtobarras.produto "
            + "WHERE produtobarras.barras LIKE ?;";

    PreparedStatement stmt = this.con.prepareStatement(sql);
    stmt.setString(1, "%" + bar);//Define o critério da consulta
    ResultSet rs = stmt.executeQuery();//executa a consulta SQL
//    percorre os registros da tabela e seta os valores das classes
    while (rs.next()) {
      p.setBarras(rs.getString("barras"));
      p.setDescricao(rs.getString("descricao"));
      p.setMva(rs.getFloat("mva"));
      p.setProduto(rs.getInt("produto"));
      p.setSuspenderCompra(rs.getBoolean("suspendercompra"));
    }
//    fecha as conexões
    rs.close();
    stmt.close();

    return p;
  }
}
